package com.dhcc.util;

import com.dhcc.jwt.JwtTokenUtil;
import com.dhcc.utils.AuthUtil;
import io.jsonwebtoken.Claims;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

/**
 * 获取当前用户 ID
 * @ProjectName Dhcc-Cloud
 * @PackageName com.dhcc.util
 * @Title UserContextUtil
 * @Date 2024/10/31 上午3:36
 * @Author LiuGuoting
 * @return 用户 ID，如果不存在则返回 null
 */
public class ContextUtil {
    // 定义日志记录器
    private static final Logger logger = LoggerFactory.getLogger(ContextUtil.class.getName());

    public static String getGatewayHeader() {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes != null) {
            return (String) attributes.getRequest().getAttribute("X-Gateway-Header");
        }
        return null;
    }
    /**
     * 获取当前用户的用户ID
     * @return 当前用户的用户ID，如果获取失败则返回null
     */
    public static String getUserId() {
        // 获取当前请求的属性（RequestAttributes）
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        // 判断 attributes 是否为空
        if (attributes == null) {
            logger.warn("请求上下文为空，无法获取请求头信息");
            return null;
        }

        // 获取请求头中的 "dhcc-auth" 信息
        String header = attributes.getRequest().getHeader("dhcc-auth");

        // 判断 header 是否为空
        if (header == null || header.isEmpty()) {
            logger.warn("请求头中缺少 dhcc-auth 信息");
            return null;
        }

        try {
            // 提取 JWT token
            String token = JwtTokenUtil.getToken(header);

            // 判断 token 是否为空或无效
            if (token == null || token.isEmpty()) {
                logger.warn("提取到的 token 为空");
                return null;
            }

            // 提取 claims 信息
            Claims claims = JwtTokenUtil.extractClaims(token);

            // 判断 claims 是否为空
            if (claims == null) {
                logger.warn("JWT 解析失败，claims 为空");
                return null;
            }

            // 获取用户 ID
            Object userIdObj = claims.get("userId");

            // 判断用户 ID 是否存在
            if (userIdObj == null) {
                logger.warn("JWT claims 中未包含 userId");
                return null;
            }

            // 返回用户 ID
            return userIdObj.toString();
        } catch (Exception e) {
            // 捕获异常并记录日志
            logger.error("获取用户 ID 时发生异常", e);
            return null;
        }
    }
}